package cn.lg.soar.system.biz.modules.auth.service;

import cn.lg.soar.common.util.current.CurrentProxy;
import cn.lg.soar.common.util.data.DataUtil;
import cn.lg.soar.common.util.data.TreeUtil;
import cn.lg.soar.database.base.service.ITreeService;
import cn.lg.soar.system.biz.modules.auth.entity.Role;
import cn.lg.soar.system.biz.modules.auth.model.RoleDto;
import cn.lg.soar.system.biz.modules.auth.model.RoleTree;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IRoleService extends ITreeService<Long, Role>, CurrentProxy<IRoleService> {

    /**
     * 根据code获取角色
     * @param codes
     * @return
     */
    List<Role> listByCodes(Collection<String> codes);

    /**
     * 根据角色id获取角色编码
     * @param roleIds
     * @return
     */
    List<String> codesByIds(List<Long> roleIds);

    /**
     * 创建
     * @param data
     * @return
     */
    Long create(RoleDto data);

    /**
     * 清空缓存
     */
    void clearCache();

    /**
     * 获取树数据
     * @return
     */
    List<RoleTree> tree();

    /**
     * 获取树数据
     * @param parentId 父id，可为空
     * @return
     */
    default List<RoleTree> tree(Long parentId) {
        List<RoleTree> tree = proxy().tree();
        if (parentId == null || parentId.equals(0L)) {
            return tree;
        }
        List<RoleTree> res = new ArrayList<>();
        TreeUtil.forEach(tree, (x) -> {
            if (parentId.equals(x.getId()) && DataUtil.isValuable(x.getChildren())) {
                res.addAll(x.getChildren());
            }
        });
        return res;
    }

}
